package com.itheima.controller;

import com.itheima.dto.StaticDto;
import com.itheima.mapper.OrderDetailMapper;
import com.itheima.pojo.OrderDetail;
import org.apache.ibatis.annotations.Select;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.math.BigDecimal;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.util.*;

@RestController
@RequestMapping("/static")
public class AnalyseController {
    @Autowired
    private OrderDetailMapper orderDetailMapper;

    /* 传入两个时间范围，返回这两个时间范围内的所有时间，并保存在一个集合中
     *
     * @param beginTime
     * @param endTime
     * @return
     * @throws ParseException
     */
    public static List<String> findDates(String beginTime, String endTime)
            throws ParseException {
        List<String> allDate = new ArrayList();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");

        Date dBegin = sdf.parse(beginTime);
        Date dEnd = sdf.parse(endTime);
        allDate.add(sdf.format(dBegin));
        Calendar calBegin = Calendar.getInstance();
        // 使用给定的 Date 设置此 Calendar 的时间
        calBegin.setTime(dBegin);
        Calendar calEnd = Calendar.getInstance();
        // 使用给定的 Date 设置此 Calendar 的时间
        calEnd.setTime(dEnd);
        // 测试此日期是否在指定日期之后
        while (dEnd.after(calBegin.getTime())) {
            // 根据日历的规则，为给定的日历字段添加或减去指定的时间量
            calBegin.add(Calendar.MONTH, 1);
            allDate.add((sdf.format(calBegin.getTime())).substring(0,(sdf.format(calBegin.getTime())).lastIndexOf("-")));
        }
        System.out.println("时间==" + allDate);
        return allDate;
    }

    @GetMapping("/dishCash")
    public Map dishCashData(){
        //模拟查询到的数据库数据
        List<StaticDto> staticDtos = new ArrayList<>();
        for (int i = 0; i < 10; i++) {
            StaticDto staticDto = new StaticDto();
            staticDto.setName("dish"+i);
            staticDto.setValue(i+1);
            staticDtos.add(staticDto);
        }
        Map map = new HashMap();
        map.put("dishCategoryCash",staticDtos);
        return map;
    }


    @RequestMapping("/cashPerMonth")
    public Map cashPerMonth2() throws ParseException {
        //1.查询数据库每月销售数量
        List<Map<String,Object>> cashPerMonth = orderDetailMapper.cashPerMonth2(2023);
        //2.计算查询的时间范围
        LocalDate nowDate = LocalDate.now();
        LocalDate beforeDate = LocalDate.now().minusYears(1);
        //3.计算出从当前月起，到去年当前月的时间列表
        List<String> timeList = findDates(beforeDate.toString(),nowDate.toString());
        List<Integer> dataList = new ArrayList<>();
        //4.遍历十二个月，查询当前月是否有销售额，如果有将销售额存储到集合中，如果没有，将B存储到集合中
        for (String time : timeList) {
            Optional<Map<String,Object>> optional = cashPerMonth.stream()
                    .filter(item-> item.get("monthList").equals(time)).findFirst();
            if(optional.isPresent()){
                //存储销售额，将销售额存储到销售额集合中
                BigDecimal dataList1 = (BigDecimal) optional.get().get("dataList");
                dataList.add(dataList1.intValue());
            }else {
                //不存在销售额，将销售额0存储到销售额集合中
                dataList.add(0);
            }
        }
        //5.封装查询结果数据
        Map resultMap = new HashMap();
        resultMap.put("monthList",timeList);//每月时间列表
        resultMap.put("dataLsit",dataList);//每月销售额列表
        return resultMap;
    }
}
